<template>
    <el-container class="top is-dark">
        <!-- 图片上传 -->
        <el-tooltip :effect="effect" content="上传图片" placement="bottom-start"> 
            <i class="el-icon-upload" size="medium" @click="$emit('showDialogUploadImg')"></i>
        </el-tooltip>
        <!-- 下载文本文档 -->
        <el-tooltip class="header__item" :effect="effect" content="下载编辑框Markdown文档" placement="bottom-start">
            <i class="el-icon-download" size="medium" @click="$emit('downLoad')"></i>
        </el-tooltip>
        <!-- 页面重置 -->
        <el-tooltip class="header__item" :effect="effect" content="重置页面" placement="bottom-start">
            <i class="el-icon-refresh" size="medium" @click="showResetConfirm = true"></i>
        </el-tooltip>
        <!-- 插入表格 -->
        <el-tooltip class="header__item header__item_last" :effect="effect" content="插入表格" placement="bottom-start">
            <i class="el-icon-s-grid" size="medium" @click="$emit('showDialogForm')"></i>
        </el-tooltip>
        <el-form size="mini" class="ctrl" :inline=true>
            <el-form-item>
                <el-select v-model="selectFont" size="mini" placeholder="选择字体" clearable @change="fontChanged">
                    <el-option v-for="font in config.builtinFonts" :style="{fontFamily: font.value}" :key="font.value"
                    :label="font.label" :value="font.value">
                        <span class="select-item-left">{{ font.label }}</span>
                        <span class="select-item-right">Abc</span>
                    </el-option>
                </el-select>
            </el-form-item>
            <el-form-item>
                <el-select v-model="selectSize" size="mini" placeholder="选择段落字号" clearable @change="sizeChanged">
                    <el-option v-for="size in config.sizeOption" :key="size.value" :label="size.label" :value="size.value">
                        <span class="select-item-left">{{ size.label }}</span>
                        <span class="select-item-right">{{ size.desc }}</span>
                    </el-option>
                </el-select>
            </el-form-item>
            <el-form-item>
                <el-select v-model="selectColor" size="mini" placeholder="选择颜色" clearable @change="colorChanged">
                    <el-option v-for="color in config.colorOption" :key="color.value" :label="color.label" :value="color.value">
                        <span class="select-item-left">{{ color.label }}</span>
                        <span class="select-item-right">{{ color.desc }}</span>
                    </el-option>
                </el-select>
            </el-form-item>
            <el-tooltip content="自定义颜色" :effect="effect" placement="top">
            <el-color-picker v-model="selectColor" size="mini" show-alpha @change="colorChanged"></el-color-picker>
            </el-tooltip>
            <el-tooltip content="微信外链自动转为文末引用" :effect="effect" placement="top">
                <el-switch class="header__switch" v-model="citeStatus" active-color="#67c23a" inactive-color="#dcdfe6" @change="statusChanged">
                </el-switch>
            </el-tooltip>
        </el-form>
        <el-tooltip class="item" :effect="effect" content="自定义CSS样式" placement="left">
            <el-button :type="btnType" plain size="medium" icon="el-icon-setting" @click="customStyle"></el-button>
        </el-tooltip>
        <el-button :type="btnType" plain size="medium" @click="copy" placement="bottom-start">复制</el-button>
        <el-button :type="btnType" plain size="medium" class="about" @click="$emit('showAboutDialog')">关于</el-button>
        <el-tooltip :content="btnContent" :effect="effect" placement="bottom-start">
            <div class="mode__switch mode__switch_black" v-if="nightMode" @click="themeChanged"></div>
            <div class="mode__switch" v-else @click="themeChanged"></div>
        </el-tooltip>
        <resetDialog :showResetConfirm="showResetConfirm" @confirm="confirmReset" @close="cancelReset"/>
      </el-container>
</template>

<script>

import {
    downLoadMD,
    setFontSize,
    fixCodeWhiteSpace,
    setColorWithCustomTemplate
} from '../../assets/scripts/util'
import {
    solveWeChatImage,
    solveHtml
} from '../../assets/scripts/converter'
import config from '../../assets/scripts/config'
import DEFAULT_CSS_CONTENT from '../../assets/scripts/themes/default-theme-css'
import resetDialog from './resetDialog'
import {mapState, mapMutations} from 'vuex'
export default {
    name: 'editor-header',
    data() {
        return {
            config: config,
            citeStatus: false,
            showResetConfirm: false,
            selectFont: '',
            selectSize: '',
            selectColor: '',
            selectCodeTheme: 'github'
        };
    },
    components: {
        resetDialog
    },
    computed: {
        effect() {
            return this.nightMode ? 'dark' : 'light'
        },
        btnContent() {
            return this.nightMode ? '浅色模式' : '暗黑模式'
        },
        btnType() {
            return this.nightMode ? 'default' : 'primary';
        },
        ...mapState({
            output: state => state.output,
            editor: state => state.editor,
            cssEditor: state => state.cssEditor,
            currentFont: state => state.currentFont,
            currentSize: state => state.currentSize,
            currentColor: state => state.currentColor,
            codeTheme: state => state.codeTheme,
            nightMode: state => state.nightMode
        })
    },
    methods: {
        fontChanged(fonts) {
            this.setWxRendererOptions({
                fonts: fonts
            })
            this.setCurrentFont(fonts);
            this.$emit('refresh')
        },
        sizeChanged(size) {
            let theme = setFontSize(size.replace('px', ''))
            theme = setColorWithCustomTemplate(theme, this.currentColor)
            this.setWxRendererOptions({
                size: size,
                theme: theme
            })
            this.setCurrentSize(size);
            this.$emit('refresh')
        },
        colorChanged(color) {
            let theme = setFontSize(this.currentSize.replace('px', ''))
            theme = setColorWithCustomTemplate(theme, color)
            this.setWxRendererOptions({
                theme: theme
            })
            this.setCurrentColor(color);
            this.$emit('refresh')
        },
        codeThemeChanged(theme) {
            this.setCurrentCodeTheme(theme);
            this.$emit('refresh')
        },
        statusChanged(val) {
            this.setCiteStatus(val)
            this.$emit('refresh')
        },
        // 复制到微信公众号
        copy(e) {
            this.$emit('startCopy');
            setTimeout(() => {
                let clipboardDiv = document.getElementById('output');
                solveWeChatImage();
                fixCodeWhiteSpace();
                solveHtml();
                clipboardDiv.focus();
                window.getSelection().removeAllRanges();
                let range = document.createRange();

                range.setStartBefore(clipboardDiv.firstChild);
                range.setEndAfter(clipboardDiv.lastChild);
                window.getSelection().addRange(range);
                document.execCommand('copy');
                window.getSelection().removeAllRanges()
                fixCodeWhiteSpace('normal');
                
                clipboardDiv.innerHTML = this.output;
                // 输出提示
                this.$notify({
                    showClose: true,
                    message: '已复制渲染后的文章到剪贴板，可直接到公众号后台粘贴',
                    offset: 80,
                    duration: 1600,
                    type: 'success'
                });
                this.$emit('refresh');
                this.$emit('endCopy');
            }, 350);
            e.target.blur(); 
        },
        // 自定义CSS样式
        async customStyle() {
            this.$emit('showCssEditor');
            this.$nextTick(() => {
                if(!this.cssEditor) {
                    this.cssEditor.refresh()
                }
            })
            setTimeout(() => {
                this.cssEditor.refresh()
            },50)
            let flag = await localStorage.getItem('__css_content')

            if (!flag) {
                this.setCssEditorValue(DEFAULT_CSS_CONTENT)
            }
        },
        // 重置页面
        confirmReset() {
            localStorage.clear()
            this.clearEditorToDefault();
            this.editor.focus()
            this.citeStatus = false;
            this.statusChanged(false);
            this.fontChanged(this.config.builtinFonts[0].value)
            this.colorChanged(this.config.colorOption[1].value)
            this.sizeChanged(this.config.sizeOption[2].value)
            this.$emit('cssChanged')
            this.selectFont = this.currentFont;
            this.selectSize = this.currentSize;
            this.selectColor = this.currentColor;
            this.showResetConfirm = false;
        },
        cancelReset() {
            this.showResetConfirm = false;
            this.editor.focus()
        },
        ...mapMutations([
            'clearEditorToDefault',
            'setCurrentColor',
            'setCiteStatus',
            'themeChanged',
            'setCurrentFont',
            'setCurrentSize',
            'setCssEditorValue',
            'setCurrentCodeTheme',
            'setWxRendererOptions'
        ])
    },
    mounted() {
        this.selectFont = this.currentFont;
        this.selectSize = this.currentSize;
        this.selectColor = this.currentColor;
        this.selectCodeTheme = this.codeTheme;
    }
}
</script>

<style lang="less" scoped>
.editor__header {
    width: 100%;
}
.header__item {
    margin: 0 3px;
}
.header__item_last {
    margin-right: 8px;
}
.header__switch {
    margin-left: 8px;
}
.mode__switch {
    margin-left: 24px;
    width: 24px;
    height: 24px;
    background: url('../../assets/images/night.png') no-repeat;
    background-size: cover;
    transition: all .3s;
}
.mode__switch_black {
    background: url('../../assets/images/light.png') no-repeat;
    background-size: cover;
}
.top {
    margin-right: 0;
}
</style>